/**
 * 统一错误处理中间件
 * 捕获所有错误并返回标准错误格式
 */
module.exports = () => {
  return async (ctx, next) => {
    try {
      await next()
    } catch (error) {
      // 记录错误日志
      ctx.logger.error('请求处理失败:', error)
      // 设置响应状态码
      let status = error.status || 500
      let message = error.message || '服务器内部错误'
      let code = error.code || status

      // 处理不同的错误类型
      if (error.name === 'ValidationError') {
        status = 400
        message = '参数验证失败'
        code = 400
      } else if (error.name === 'UnauthorizedError') {
        status = 401
        message = '未授权访问'
        code = 401
      } else if (error.name === 'ForbiddenError') {
        status = 403
        message = '禁止访问'
        code = 403
      } else if (error.name === 'NotFoundError') {
        status = 404
        message = '资源不存在'
        code = 404
      }

      // 构建错误响应格式
      const errorResponse = {
        code,
        message,
        data: null,
        timestamp: Date.now(),
        path: ctx.path
      }

      // 开发环境下返回错误堆栈
      if (ctx.app.config.env === 'local' && error.stack) {
        errorResponse.stack = error.stack
      }

      // 参数验证错误的详细信息
      if (error.errors) {
        errorResponse.errors = error.errors
      }

      ctx.status = status
      ctx.body = errorResponse
    }
  }
}
